home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / a_utils / yacc / flexyacc / aflex.lha / aflex / src / template_managerB.a < prev    next >
Text File  |  1993-05-31  |  18KB  |  476 lines

  1. -- Copyright (c) 1990 Regents of the University of California.
  2. -- All rights reserved.
  3. --
  4. -- This software was developed by John Self of the Arcadia project
  5. -- at the University of California, Irvine.
  6. --
  7. -- Redistribution and use in source and binary forms are permitted
  8. -- provided that the above copyright notice and this paragraph are
  9. -- duplicated in all such forms and that any documentation,
  10. -- advertising materials, and other materials related to such
  11. -- distribution and use acknowledge that the software was developed
  12. -- by the University of California, Irvine.  The name of the
  13. -- University may not be used to endorse or promote products derived
  14. -- from this software without specific prior written permission.
  15. -- THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
  16. -- IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
  17. -- WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  18.  
  19. -- TITLE template manager
  20. -- AUTHOR: John Self (UCI)
  21. -- DESCRIPTION supports output of internalized templates for the IO and DFA
  22. --             packages.
  23. -- NOTES This package is quite a memory hog, and is really only useful on
  24. --       virtual memory systems.  It could use an external file to store the
  25. --       templates like the skeleton manager.  This would save memory at the
  26. --       cost of a slight reduction in speed and the necessity of keeping
  27. --       copies of the template files in a known place.
  28. -- $Header: /dc/uc/self/arcadia/aflex/ada/src/RCS/template_managerB.a,v 1.21 1992/12/29 22:46:15 self Exp self $ 
  29.  
  30. with FILE_STRING, MISC_DEFS, TEXT_IO, EXTERNAL_FILE_MANAGER, MISC, TSTRING; use 
  31.   FILE_STRING, MISC_DEFS, TEXT_IO; 
  32. package body TEMPLATE_MANAGER is 
  33.  
  34.   type FILE_ARRAY is array(POSITIVE range <>) of VSTRING; 
  35.  
  36.   DFA_TEMPLATE     : constant FILE_ARRAY := (
  37.   --DFA TEMPLATE START
  38. VSTR("yytext_ptr : integer; -- points to start of yytext in buffer"),
  39. VSTR(""),
  40. VSTR("-- yy_ch_buf has to be 2 characters longer than YY_BUF_SIZE because we need"),
  41. VSTR("-- to put in 2 end-of-buffer characters (this is explained where it is"), 
  42. VSTR("-- done) at the end of yy_ch_buf"),
  43. VSTR("YY_READ_BUF_SIZE : constant integer :=  8192;"),
  44. VSTR("YY_BUF_SIZE : constant integer := YY_READ_BUF_SIZE * 2; -- size of input buffer"),
  45. VSTR("type unbounded_character_array is array(integer range <>) of character;"),
  46. VSTR("subtype ch_buf_type is unbounded_character_array(0..YY_BUF_SIZE + 1);"),
  47. VSTR("yy_ch_buf : ch_buf_type;"), VSTR("yy_cp, yy_bp : integer;"),
  48. VSTR(""),
  49. VSTR("-- yy_hold_char holds the character lost when yytext is formed"),
  50. VSTR("yy_hold_char : character;"),
  51. VSTR("yy_c_buf_p : integer;   -- points to current character in buffer"),
  52. VSTR(""),
  53. VSTR("function YYText return string;"),
  54. VSTR("function YYLength return integer;"),
  55. VSTR("procedure YY_DO_BEFORE_ACTION;"),
  56. VSTR("--These variables are needed between calls to YYLex."),
  57. VSTR("yy_init : boolean := true; -- do we need to initialize YYLex?"),
  58. VSTR("yy_start : integer := 0; -- current start state number"),
  59. VSTR("subtype yy_state_type is integer;"),
  60. VSTR("yy_last_accepting_state : yy_state_type;"),
  61. VSTR("yy_last_accepting_cpos : integer;"),
  62. VSTR("%%"),
  63. VSTR("function YYText return string is"),
  64. VSTR("    i : integer;"),
  65. VSTR("    str_loc : integer := 1;"),
  66. VSTR("    buffer : string(1..1024);"),
  67. VSTR("    EMPTY_STRING : constant string := """";"),
  68. VSTR("begin"),
  69. VSTR("    -- find end of buffer"),
  70. VSTR("    i := yytext_ptr;"),
  71. VSTR("    while ( yy_ch_buf(i) /= ASCII.NUL ) loop"),
  72. VSTR("    buffer(str_loc ) := yy_ch_buf(i);"),
  73. VSTR("        i := i + 1;"),
  74. VSTR("    str_loc := str_loc + 1;"),
  75. VSTR("    end loop;"),
  76. VSTR("--    return yy_ch_buf(yytext_ptr.. i - 1);"),
  77. VSTR(""),
  78. VSTR("    if (str_loc < 2) then"),
  79. VSTR("        return EMPTY_STRING;"),
  80. VSTR("    else"),
  81. VSTR("      return buffer(1..str_loc-1);"),
  82. VSTR("    end if;"),
  83. VSTR(""),
  84. VSTR("end;"),
  85. VSTR(""),
  86. VSTR("-- returns the length of the matched text"),
  87. VSTR("function YYLength return integer is"),
  88. VSTR("begin"), VSTR("    return yy_cp - yy_bp;"),
  89. VSTR("end YYLength;"),
  90. VSTR(""),
  91. VSTR("-- done after the current pattern has been matched and before the"),
  92. VSTR("-- corresponding action - sets up yytext"),
  93. VSTR(""),
  94. VSTR("procedure YY_DO_BEFORE_ACTION is"),
  95. VSTR("begin"),
  96. VSTR("    yytext_ptr := yy_bp;"),
  97. VSTR("    yy_hold_char := yy_ch_buf(yy_cp);"), 
  98. VSTR("    yy_ch_buf(yy_cp) := ASCII.NUL;"),
  99. VSTR("    yy_c_buf_p := yy_cp;"),
  100. VSTR("end YY_DO_BEFORE_ACTION;"),
  101. VSTR("")
  102. --DFA TEMPLATE END
  103. ); 
  104.  
  105.   DFA_CURRENT_LINE : INTEGER := 1; 
  106.  
  107.   IO_TEMPLATE      : constant FILE_ARRAY := (
  108.   --IO TEMPLATE START
  109. VSTR("with text_io; use text_io;"),
  110. VSTR(""),
  111. VSTR("%%"),
  112. VSTR("user_input_file : file_type;"),
  113. VSTR("user_output_file : file_type;"),
  114. VSTR("NULL_IN_INPUT : exception;"),
  115. VSTR("AFLEX_INTERNAL_ERROR : exception;"),
  116. VSTR("UNEXPECTED_LAST_MATCH : exception;"),
  117. VSTR("PUSHBACK_OVERFLOW : exception;"),
  118. VSTR("AFLEX_SCANNER_JAMMED : exception;"),
  119. VSTR("type eob_action_type is ( EOB_ACT_RESTART_SCAN,"),
  120. VSTR("                          EOB_ACT_END_OF_FILE,"),
  121. VSTR("                          EOB_ACT_LAST_MATCH );"),
  122. VSTR("YY_END_OF_BUFFER_CHAR :  constant character:=  ASCII.NUL;"),
  123. VSTR("yy_n_chars : integer;       -- number of characters read into yy_ch_buf"),
  124. VSTR(""),
  125. VSTR("-- true when we've seen an EOF for the current input file"),
  126. VSTR("yy_eof_has_been_seen : boolean;"), VSTR(""),
  127. VSTR("procedure YY_INPUT(buf: out unbounded_character_array; result: out integer; max_size: in integer);"),
  128. VSTR("function yy_get_next_buffer return eob_action_type;"),
  129. VSTR("procedure yyunput( c : character; yy_bp: in out integer );"),
  130. VSTR("procedure unput(c : character);"),
  131. VSTR("function input return character;"),
  132. VSTR("procedure output(c : character);"),
  133. VSTR("function yywrap return boolean;"),
  134. VSTR("procedure Open_Input(fname : in String);"),
  135. VSTR("procedure Close_Input;"),
  136. VSTR("procedure Create_Output(fname : in String := """");"),
  137. VSTR("procedure Close_Output;"),
  138. VSTR("%%"),
  139. VSTR("-- gets input and stuffs it into 'buf'.  number of characters read, or YY_NULL,"),
  140. VSTR("-- is returned in 'result'."),
  141. VSTR(""),
  142. VSTR("procedure YY_INPUT(buf: out unbounded_character_array; result: out integer; max_size: in integer) is"),
  143. VSTR("    c : character;"),
  144. VSTR("    i : integer := 1;"),
  145. VSTR("    loc : integer := buf'first;"),
  146. VSTR("begin"),
  147. VSTR("    if (is_open(user_input_file)) then"),
  148. VSTR("      while ( i <= max_size ) loop"),
  149. VSTR("         if (end_of_line(user_input_file)) then -- Ada ate our newline, put it back on the end."),
  150. VSTR("             buf(loc) := ASCII.LF;"),
  151. VSTR("             skip_line(user_input_file, 1);"),
  152. VSTR("         else"),
  153. VSTR("           get(user_input_file, buf(loc));"),
  154. VSTR("         end if;"),
  155. VSTR(""),
  156. VSTR("         loc := loc + 1;"),
  157. VSTR("         i := i + 1;"),
  158. VSTR("      end loop;"),
  159. VSTR("    else"),
  160. VSTR("      while ( i <= max_size ) loop"),
  161. VSTR("         if (end_of_line) then -- Ada ate our newline, put it back on the end."),
  162. VSTR("             buf(loc) := ASCII.LF;"),
  163. VSTR("             skip_line(1);"),
  164. VSTR("%%"),
  165. VSTR(""),
  166. VSTR("         else"),
  167. VSTR("             get(buf(loc));"), 
  168. VSTR("         end if; "),
  169. VSTR(""),
  170. VSTR("         loc := loc + 1;"),
  171. VSTR("         i := i + 1;"),
  172. VSTR("      end loop;"),
  173. VSTR("    end if; -- for input file being standard input"),
  174. VSTR(""),
  175. VSTR("    result := i - 1; "),
  176. VSTR("    exception"),
  177. VSTR("        when END_ERROR => result := i - 1;"),
  178. VSTR("    -- when we hit EOF we need to set yy_eof_has_been_seen"),
  179. VSTR("    yy_eof_has_been_seen := true;"),
  180. VSTR("end YY_INPUT;"),
  181. VSTR(""),
  182. VSTR("-- yy_get_next_buffer - try to read in new buffer"),
  183. VSTR("--"),
  184. VSTR("-- returns a code representing an action"),
  185. VSTR("--     EOB_ACT_LAST_MATCH - "),
  186. VSTR("--     EOB_ACT_RESTART_SCAN - restart the scanner"),
  187. VSTR("--     EOB_ACT_END_OF_FILE - end of file"),
  188. VSTR(""),
  189. VSTR("function yy_get_next_buffer return eob_action_type is"),
  190. VSTR("    dest : integer := 0;"),
  191. VSTR("    source : integer := yytext_ptr - 1; -- copy prev. char, too"),
  192. VSTR("    number_to_move : integer;"),
  193. VSTR("    ret_val : eob_action_type;"), 
  194. VSTR("    num_to_read : integer;"),
  195. VSTR("begin    "),
  196. VSTR("    if ( yy_c_buf_p > yy_n_chars + 1 ) then"),
  197. VSTR("        raise NULL_IN_INPUT;"),
  198. VSTR("    end if;"),
  199. VSTR(""),
  200. VSTR("    -- try to read more data"),
  201. VSTR(""),
  202. VSTR("    -- first move last chars to start of buffer"),
  203. VSTR("    number_to_move := yy_c_buf_p - yytext_ptr;"),
  204. VSTR(""),
  205. VSTR("    for i in 0..number_to_move - 1 loop"),
  206. VSTR("        yy_ch_buf(dest) := yy_ch_buf(source);"),
  207. VSTR("    dest := dest + 1;"),
  208. VSTR("    source := source + 1;"),
  209. VSTR("    end loop;"),
  210. VSTR("        "),
  211. VSTR("    if ( yy_eof_has_been_seen ) then"),
  212. VSTR("    -- don't do the read, it's not guaranteed to return an EOF,"),
  213. VSTR("    -- just force an EOF"),
  214. VSTR(""),
  215. VSTR("    yy_n_chars := 0;"),
  216. VSTR("    else"),
  217. VSTR("    num_to_read := YY_BUF_SIZE - number_to_move - 1;"), 
  218. VSTR(""),
  219. VSTR("    if ( num_to_read > YY_READ_BUF_SIZE ) then"),
  220. VSTR("        num_to_read := YY_READ_BUF_SIZE;"),
  221. VSTR("        end if;"),
  222. VSTR(""),
  223. VSTR("    -- read in more data"),
  224. VSTR("    YY_INPUT( yy_ch_buf(number_to_move..yy_ch_buf'last), yy_n_chars, num_to_read );"),
  225. VSTR("    end if;"),
  226. VSTR("    if ( yy_n_chars = 0 ) then"),
  227. VSTR("    if ( number_to_move = 1 ) then"),
  228. VSTR("        ret_val := EOB_ACT_END_OF_FILE;"),
  229. VSTR("    else"),
  230. VSTR("        ret_val := EOB_ACT_LAST_MATCH;"),
  231. VSTR("        end if;"),
  232. VSTR(""),
  233. VSTR("    yy_eof_has_been_seen := true;"),
  234. VSTR("    else"),
  235. VSTR("    ret_val := EOB_ACT_RESTART_SCAN;"),
  236. VSTR("    end if;"),
  237. VSTR("    "), 
  238. VSTR("    yy_n_chars := yy_n_chars + number_to_move;"),
  239. VSTR("    yy_ch_buf(yy_n_chars) := YY_END_OF_BUFFER_CHAR;"),
  240. VSTR("    yy_ch_buf(yy_n_chars + 1) := YY_END_OF_BUFFER_CHAR;"),
  241. VSTR(""),
  242. VSTR("    -- yytext begins at the second character in"),
  243. VSTR("    -- yy_ch_buf; the first character is the one which"),
  244. VSTR("    -- preceded it before reading in the latest buffer;"),
  245. VSTR("    -- it needs to be kept around in case it's a"),
  246. VSTR("    -- newline, so yy_get_previous_state() will have"),
  247. VSTR("    -- with '^' rules active"),
  248. VSTR(""),
  249. VSTR("    yytext_ptr := 1;"),
  250. VSTR(""),
  251. VSTR("    return ret_val;"),
  252. VSTR("end yy_get_next_buffer;"),
  253. VSTR(""),
  254. VSTR("procedure yyunput( c : character; yy_bp: in out integer ) is"), 
  255. VSTR("    number_to_move : integer;"),
  256. VSTR("    dest : integer;"),
  257. VSTR("    source : integer;"),
  258. VSTR("    tmp_yy_cp : integer;"),
  259. VSTR("begin"),
  260. VSTR("    tmp_yy_cp := yy_c_buf_p;"),
  261. VSTR("    yy_ch_buf(tmp_yy_cp) := yy_hold_char; -- undo effects of setting up yytext"),
  262. VSTR(""),
  263. VSTR("    if ( tmp_yy_cp < 2 ) then"),
  264. VSTR("    -- need to shift things up to make room"),
  265. VSTR("    number_to_move := yy_n_chars + 2; -- +2 for EOB chars"),
  266. VSTR("    dest := YY_BUF_SIZE + 2;"),
  267. VSTR("    source := number_to_move;"),
  268. VSTR(""),
  269. VSTR("    while ( source > 0 ) loop"),
  270. VSTR("        dest := dest - 1;"),
  271. VSTR("        source := source - 1;"),
  272. VSTR("            yy_ch_buf(dest) := yy_ch_buf(source);"),
  273. VSTR("    end loop;"),
  274. VSTR(""),
  275. VSTR("    tmp_yy_cp := tmp_yy_cp + dest - source;"),
  276. VSTR("    yy_bp := yy_bp + dest - source;"),
  277. VSTR("    yy_n_chars := YY_BUF_SIZE;"),
  278. VSTR(""),
  279. VSTR("    if ( tmp_yy_cp < 2 ) then"),
  280. VSTR("        raise PUSHBACK_OVERFLOW;"),
  281. VSTR("    end if;"),
  282. VSTR("    end if;"),
  283. VSTR(""),
  284. VSTR("    if ( tmp_yy_cp > yy_bp and then yy_ch_buf(tmp_yy_cp-1) = ASCII.LF ) then"),
  285. VSTR("    yy_ch_buf(tmp_yy_cp-2) := ASCII.LF;"),
  286. VSTR("    end if;"),
  287. VSTR(""),
  288. VSTR("    tmp_yy_cp := tmp_yy_cp - 1;"),
  289. VSTR("    yy_ch_buf(tmp_yy_cp) := c;"),
  290. VSTR(""),
  291. VSTR("--  Note:  this code is the text of YY_DO_BEFORE_ACTION, only"),
  292. VSTR("--         here we get different yy_cp and yy_bp's"),
  293. VSTR("    yytext_ptr := yy_bp;"),
  294. VSTR("    yy_hold_char := yy_ch_buf(tmp_yy_cp);"),
  295. VSTR("    yy_ch_buf(tmp_yy_cp) := ASCII.NUL;"),
  296. VSTR("    yy_c_buf_p := tmp_yy_cp;"),
  297. VSTR("end yyunput;"),
  298. VSTR(""),
  299. VSTR("procedure unput(c : character) is"),
  300. VSTR("begin"),
  301. VSTR("     yyunput( c, yy_bp );"),
  302. VSTR("end unput;"),
  303. VSTR(""),
  304. VSTR("function input return character is"),
  305. VSTR("    c : character;"),
  306. VSTR("    yy_cp : integer := yy_c_buf_p;"),
  307. VSTR("begin"),
  308. VSTR("    yy_ch_buf(yy_cp) := yy_hold_char;"),
  309. VSTR(""),
  310. VSTR("    if ( yy_ch_buf(yy_c_buf_p) = YY_END_OF_BUFFER_CHAR ) then"),
  311. VSTR("    -- need more input"),
  312. VSTR("    yytext_ptr := yy_c_buf_p;"),
  313. VSTR("    yy_c_buf_p := yy_c_buf_p + 1;"),
  314. VSTR(""),
  315. VSTR("    case yy_get_next_buffer is"),
  316. VSTR("        -- this code, unfortunately, is somewhat redundant with"),
  317. VSTR("        -- that above"),
  318. VSTR(""),
  319. VSTR("        when EOB_ACT_END_OF_FILE =>"),
  320. VSTR("        if ( yywrap ) then"), 
  321. VSTR("            yy_c_buf_p := yytext_ptr;"),
  322. VSTR("            return ASCII.NUL;"),
  323. VSTR("        end if;"),
  324. VSTR(""),
  325. VSTR("        yy_ch_buf(0) := ASCII.LF;"),
  326. VSTR("        yy_n_chars := 1;"),
  327. VSTR("        yy_ch_buf(yy_n_chars) := YY_END_OF_BUFFER_CHAR;"),
  328. VSTR("        yy_ch_buf(yy_n_chars + 1) := YY_END_OF_BUFFER_CHAR;"),
  329. VSTR("        yy_eof_has_been_seen := false;"),
  330. VSTR("        yy_c_buf_p := 1;"),
  331. VSTR("        yytext_ptr := yy_c_buf_p;"),
  332. VSTR("        yy_hold_char := yy_ch_buf(yy_c_buf_p);"),
  333. VSTR(""),
  334. VSTR("        return ( input );"),
  335. VSTR("        when EOB_ACT_RESTART_SCAN =>"), 
  336. VSTR("        yy_c_buf_p := yytext_ptr;"),
  337. VSTR(""),
  338. VSTR("        when EOB_ACT_LAST_MATCH =>"),
  339. VSTR("        raise UNEXPECTED_LAST_MATCH;"),
  340. VSTR("        when others => null;"),
  341. VSTR("        end case;"),
  342. VSTR("    end if;"),
  343. VSTR(""),
  344. VSTR("    c := yy_ch_buf(yy_c_buf_p);"),
  345. VSTR("    yy_c_buf_p := yy_c_buf_p + 1;"),
  346. VSTR("    yy_hold_char := yy_ch_buf(yy_c_buf_p);"),
  347. VSTR(""),
  348. VSTR("    return c;"),
  349. VSTR("end input;"),
  350. VSTR(""),
  351. VSTR("procedure output(c : character) is"),
  352. VSTR("begin"),
  353. VSTR("    if (is_open(user_output_file)) then"),
  354. VSTR("      text_io.put(user_output_file, c);"),
  355. VSTR("    else"),
  356. VSTR("      text_io.put(c);"),
  357. VSTR("    end if;"),
  358. VSTR("end output;"),
  359. VSTR(""),
  360. VSTR("-- default yywrap function - always treat EOF as an EOF"),
  361. VSTR("function yywrap return boolean is"),
  362. VSTR("begin"),
  363. VSTR("    return true;"),
  364. VSTR("end yywrap;"),
  365. VSTR(""),
  366. VSTR("procedure Open_Input(fname : in String) is"),
  367. VSTR("begin"),
  368. VSTR("    yy_init := true;"),
  369. VSTR("    open(user_input_file, in_file, fname);"),
  370. VSTR("end Open_Input;"),
  371. VSTR(""),
  372. VSTR("procedure Create_Output(fname : in String := """") is"),
  373. VSTR("begin"),
  374. VSTR("    if (fname /= """") then"),
  375. VSTR("        create(user_output_file, out_file, fname);"),
  376. VSTR("    end if;"),
  377. VSTR("end Create_Output;"),
  378. VSTR(""),
  379. VSTR("procedure Close_Input is"),
  380. VSTR("begin"),
  381. VSTR("   if (is_open(user_input_file)) then"),
  382. VSTR("     text_io.close(user_input_file);"),
  383. VSTR("   end if;"),
  384. VSTR("end Close_Input;"),
  385. VSTR(""),
  386. VSTR("procedure Close_Output is"),
  387. VSTR("begin"),
  388. VSTR("   if (is_open(user_output_file)) then"),
  389. VSTR("     text_io.close(user_output_file);"),
  390. VSTR("   end if;"),
  391. VSTR("end Close_Output;"),
  392. VSTR("")
  393. --IO TEMPLATE END
  394. ); 
  395.  
  396.   IO_CURRENT_LINE  : INTEGER := 1; 
  397.  
  398.   procedure TEMPLATE_OUT(OUTFILE          : in FILE_TYPE; 
  399.                          CURRENT_TEMPLATE : in FILE_ARRAY; 
  400.                          LINE_NUMBER      : in out INTEGER) is 
  401.     BUF : VSTRING; 
  402.   begin
  403.     while (not (LINE_NUMBER > CURRENT_TEMPLATE'LAST)) loop
  404.       BUF := CURRENT_TEMPLATE(LINE_NUMBER); 
  405.       LINE_NUMBER := LINE_NUMBER + 1; 
  406.       if ((FILE_STRING.LEN(BUF) >= 2) and then ((CHAR(BUF, 1) = '%') and (CHAR(
  407.         BUF, 2) = '%'))) then 
  408.         exit; 
  409.       else 
  410.         FILE_STRING.PUT_LINE(OUTFILE, BUF); 
  411.       end if; 
  412.     end loop; 
  413.   end TEMPLATE_OUT; 
  414.  
  415.   procedure GENERATE_DFA_FILE is 
  416.     DFA_OUT_FILE : FILE_TYPE; 
  417.   begin
  418.     EXTERNAL_FILE_MANAGER.GET_DFA_FILE(DFA_OUT_FILE); 
  419.     TEXT_IO.PUT_LINE(DFA_OUT_FILE, "package " & TSTRING.STR(MISC.BASENAME) & 
  420.       "_dfa" & " is"); 
  421.  
  422.     if (DDEBUG) then 
  423.  
  424.       -- make a scanner that output acceptance information
  425.       TEXT_IO.PUT_LINE(DFA_OUT_FILE, "aflex_debug : boolean := true;"); 
  426.     else 
  427.       TEXT_IO.PUT_LINE(DFA_OUT_FILE, "aflex_debug : boolean := false;"); 
  428.     end if; 
  429.     TEMPLATE_OUT(DFA_OUT_FILE, DFA_TEMPLATE, DFA_CURRENT_LINE); 
  430.     TEXT_IO.PUT_LINE(DFA_OUT_FILE, "end " & TSTRING.STR(MISC.BASENAME) & "_dfa;"
  431.       ); 
  432.     TEXT_IO.NEW_LINE(DFA_OUT_FILE); 
  433.     TEXT_IO.PUT(DFA_OUT_FILE, "with " & TSTRING.STR(MISC.BASENAME) & "_dfa" & 
  434.       "; "); 
  435.     TEXT_IO.PUT_LINE(DFA_OUT_FILE, "use " & TSTRING.STR(MISC.BASENAME) & "_dfa"
  436.       & "; "); 
  437.     TEXT_IO.PUT_LINE(DFA_OUT_FILE, "package body " & TSTRING.STR(MISC.BASENAME)
  438.       & "_dfa" & " is"); 
  439.     TEMPLATE_OUT(DFA_OUT_FILE, DFA_TEMPLATE, DFA_CURRENT_LINE); 
  440.     TEXT_IO.PUT_LINE(DFA_OUT_FILE, "end " & TSTRING.STR(MISC.BASENAME) & "_dfa;"
  441.       ); 
  442.   end GENERATE_DFA_FILE; 
  443.  
  444.   procedure GENERATE_IO_FILE is 
  445.     IO_OUT_FILE : FILE_TYPE; 
  446.   begin
  447.     EXTERNAL_FILE_MANAGER.GET_IO_FILE(IO_OUT_FILE); 
  448.     TEXT_IO.PUT(IO_OUT_FILE, "with " & TSTRING.STR(MISC.BASENAME) & "_dfa" & 
  449.       "; "); 
  450.     TEXT_IO.PUT_LINE(IO_OUT_FILE, "use " & TSTRING.STR(MISC.BASENAME) & "_dfa"
  451.       & "; "); 
  452.     TEMPLATE_OUT(IO_OUT_FILE, IO_TEMPLATE, IO_CURRENT_LINE); 
  453.     TEXT_IO.PUT_LINE(IO_OUT_FILE, "package " & TSTRING.STR(MISC.BASENAME) & 
  454.       "_io" & " is"); 
  455.     TEMPLATE_OUT(IO_OUT_FILE, IO_TEMPLATE, IO_CURRENT_LINE); 
  456.     TEXT_IO.PUT_LINE(IO_OUT_FILE, "end " & TSTRING.STR(MISC.BASENAME) & "_io;")
  457.       ; 
  458.     TEXT_IO.NEW_LINE(IO_OUT_FILE); 
  459.     TEXT_IO.PUT_LINE(IO_OUT_FILE, "package body " & TSTRING.STR(MISC.BASENAME)
  460.       & "_io" & " is"); 
  461.     TEMPLATE_OUT(IO_OUT_FILE, IO_TEMPLATE, IO_CURRENT_LINE); 
  462.     -- If we're generating a scanner for interactive mode we need to generate
  463.     -- a YY_INPUT that stops at the end of each line
  464.     if INTERACTIVE then
  465.         TEXT_IO.PUT_LINE(IO_OUT_FILE,
  466.         "            i := i + 1; -- update counter, miss end of loop");
  467.     TEXT_IO.PUT_LINE(IO_OUT_FILE,
  468.         "            exit; -- in interactive mode return at end of line.");
  469.     end if;
  470.     TEMPLATE_OUT(IO_OUT_FILE, IO_TEMPLATE, IO_CURRENT_LINE);     
  471.     TEXT_IO.PUT_LINE(IO_OUT_FILE, "end " & TSTRING.STR(MISC.BASENAME) & "_io;")
  472.       ; 
  473.   end GENERATE_IO_FILE; 
  474.  
  475. end TEMPLATE_MANAGER; 
  476.